 \def\dated#1{\def\thedate{#1}}%
 \dated{2008-12-02}%
 % This is a package of commutative diagram macros built on top of Xy-pic%
 % by Michael Barr (email:  barr@barrs.org).  Its use is unrestricted.  It%
 % may be freely distributed, unchanged, for non-commercial or commercial%
 % use.  If changed, it must be renamed.  Inclusion in a commercial%
 % software package is also permitted, but I would appreciate receiving a%
 % free copy for my personal examination and use.  There are no guarantees%
 % that this package is good for anything.  I have tested it with LaTeX 2e,%
 % LaTeX 2.09 and Plain TeX.  Although I know of no reason it will not work%
 % with AMSTeX, I have not tested it.%
 % Added 2003-05-10: I now know that the only clash is with \square in%
 % amssymb, which should therefore be loaded first.  If the amssymb%
 % \square is required, you can \let\box\square and use \box instead.%

\newcount\atcode \atcode=\catcode`\@%
\catcode`\@=12%
\input xy
\xyoption{arrow}
\xyoption{curve}
\catcode`\@=11
 \newdimen\xydashw@@
 \xydashw@@\xydashw@
 \multiply\xydashw@@ by 7
 \divide\xydashw@@ by 4
\setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@@
 \kern-\dimen@ \vrule width\xydashw@@ height\dimen@ depth\dimen@}
\wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
\catcode`\@=12


\newdir{ >}{{ }*!/-.9em/@{>}}%
 % \newdir{ (}{{ }*!/-.5em/@{(}}%
\newdir^{ (}{{ }*!/-.5em/@^{(}}%
\newdir{< }{!/.9em/@{<}*{ }}%
\newdir{) }{!/.9em/@^{)}*{ }}%
\newdir{ (}{{ }*!/-.5em/@^{(}}%
\newdir{d}{\object{.}}

\newdimen\high%
\newdimen\ul%
\newcount\deltax%
\newcount\deltay%
\newcount\deltaX%
\newcount\deltaXprime%
\newcount\deltaY%
\newcount\deltaYprime%

\newdimen\wdth%
\newcount\xend%
\newcount\yend%
\newcount\Xend%
\newcount\Yend%
\newcount\xpos%
\newcount\ypos%
\newcount\default \default=500%
\newcount\defaultmargin \defaultmargin=150%
\newcount\topw%
\newcount\botw%
\newcount\Xpos%
\newcount\Ypos%
\def\ratchet#1#2{\ifnum#1<#2\global #1=#2\fi}%

\catcode`\@=11%
\expandafter\ifx\csname @ifnextchar\endcsname\relax%
\def\ifnextchar#1#2#3{\let\@tempe%
#1\def\@tempa{#2}\def\@tempb{#3}\futurelet%
    \@tempc\@ifnch}%
\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch%
      \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi%
      \fi \@tempd}%
\def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token%
\def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}%
\else%
\let\ifnextchar\@ifnextchar%
\fi%
 % \ifx\check@mathfonts\undefined%
 % \else \check@mathfonts%
 % \fi%
\setbox0=\hbox{$x$}
\newdimen\axis \axis=\fontdimen22\textfont2%
\ul=.01em%
\X@xbase =.01em%
\Y@ybase =.01em%
\def\scalefactor#1{\ul=#1\ul \X@xbase=#1\X@xbase \Y@ybase=#1\Y@ybase}%
\catcode`\@=12%

\def\fontscale#1{%
\if#1h\relax%
\font\xydashfont=xydash10 scaled \magstephalf%
\font\xyatipfont=xyatip10 scaled \magstephalf%
\font\xybtipfont=xybtip10 scaled \magstephalf%
\font\xybsqlfont=xybsql10 scaled \magstephalf%
\font\xycircfont=xycirc10 scaled \magstephalf%
\else%
\font\xydashfont=xydash10 scaled \magstep#1%
\font\xyatipfont=xyatip10 scaled \magstep#1%
\font\xybtipfont=xybtip10 scaled \magstep#1%
\font\xybsqlfont=xybsql10 scaled \magstep#1%
\font\xycircfont=xycirc10 scaled \magstep#1%
\fi}%

\def\bfig{\vcenter\bgroup\xy}%
\def\efig{\endxy\egroup}%

\def\car#1#2\nil{#1}%

\def\morphism{\ifnextchar({\morphismp}{\morphismp(0,0)}}%
\def\morphismp(#1){\ifnextchar|{\morphismpp(#1)}{\morphismpp(#1)|a|}}%
\def\morphismpp(#1)|#2|{\ifnextchar/{\morphismppp(#1)|#2|}%
    {\morphismppp(#1)|#2|/>/}}%
\def\morphismppp(#1)|#2|/#3/{%
    \ifnextchar<{\morphismpppp(#1)|#2|/#3/}%
    {\morphismpppp(#1)|#2|/#3/<\default,0>}}%

\def\morphismpppp(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
\xend#1\advance \xend by #5%
\yend#2\advance \yend by #6%
\domorphism(#1,#2)|#3|/#4/<#5,#6>[{#7}`{#8};{#9}]}%


\def\domorphism(#1,#2)|#3|/#4/<#5,#6>[#7`#8;#9]{%
 % Check if arrow arg has an @; then don't add it.%
\def\next{\car#4.\nil}%
\if@\next\relax%
 \if#3l%
  \ifnum #6>0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3m%
    \setbox0\hbox{$#9$}%
   \ifdim \wd0=0pt%
     \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4 (\xend,\yend)*+!!<0ex,\axis>{#8}%
   \else%
     \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4|-*+<1pt,4pt>{\labelstyle#9}%
       (\xend,\yend)*+!!<0ex,\axis>{#8}%
   \fi%
 \else \if#3r%
  \ifnum #6<0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3a%
  \ifnum #5>0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3b%
  \ifnum #5<0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar#4 (\xend,\yend)*+!!<0ex,\axis>{#8}%
 \fi\fi\fi\fi\fi%
 %% Otherwise, have to add @{..}%
\else%
 \if#3l%
  \ifnum #6>0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3m%
    \setbox0\hbox{$#9$}%
   \ifdim \wd0=0pt%
     \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,\axis>{#8}%
   \else%
     \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}|-*+<1pt,4pt>{\labelstyle#9}%
         (\xend,\yend)*+!!<0ex,\axis>{#8}%
   \fi%
 \else \if#3r%
  \ifnum #6<0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3a%
  \ifnum #5>0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else \if#3b%
  \ifnum #5<0%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}^-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4}_-{#9} (\xend,\yend)*+!!<0ex,\axis>{#8}%
  \fi%
 \else%
   \POS(#1,#2)*+!!<0ex,\axis>{#7}\ar@{#4} (\xend,\yend)*+!!<0ex,\axis>{#8}%
 \fi\fi\fi\fi\fi%
\fi\ignorespaces}%

\def\vect(#1,#2)/#3/<#4,#5>{%
 \xend#1 \yend#2 \advance\xend by #4 \advance\yend by #5%
     \POS(#1,#2)\ar#3 (\xend,\yend)}%

\def\squarepppp(#1,#2)|#3|/#4`#5`#6`#7/<#8>[#9]{%
\xpos#1\ypos#2%
\def\next|##1##2##3##4|{%
 \def\xa{##1}\def\xb{##2}\def\xc{##3}\def\xd{##4}\ignorespaces}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
    \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\ignorespaces}%
\next[#9]%
\morphism(\xpos,\ypos)|\xd|/{#7}/<\deltax,0>[\nodec`\noded;\labeld]%
\advance \ypos by \deltay%
\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
 \advance \xpos by \deltax%
\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\noded;\labelc]%
\ignorespaces}%

\def\square{\ifnextchar({\squarep}{\squarep(0,0)}}%
\def\squarep(#1){\ifnextchar|{\squarepp(#1)}{\squarepp(#1)|alrb|}}%
\def\squarepp(#1)|#2|{\ifnextchar/{\squareppp(#1)|#2|}%
    {\squareppp(#1)|#2|/>`>`>`>/}}%
\def\squareppp(#1)|#2|/#3`#4`#5`#6/{%
    \ifnextchar<{\squarepppp(#1)|#2|/#3`#4`#5`#6/}%
    {\squarepppp(#1)|#2|/#3`#4`#5`#6/<\default,\default>}}%

\def\diamondpppp(#1,#2)|#3|/#4`#5`#6`#7/<#8>[#9]{%
\xpos#1\ypos#2%
\def\next|##1##2##3##4|{%
 \def\xa{##1}\def\xb{##2}\def\xc{##3}\def\xd{##4}\ignorespaces}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
    \def\labela{##5}\def\labelb{##6}\def\labelc{##7}%
\def\labeld{##8}\ignorespaces}%
\next[#9]%
\advance\ypos\deltay
\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,-\deltay>[\nodeb`\noded;\labelc]%
\advance\xpos \deltax
\advance\xpos \deltax
\morphism(\xpos,\ypos)|\xd|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labeld]%
\advance\ypos\deltay \advance\xpos -\deltax
\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
}
\def\Diamond{\ifnextchar({\diamondp}{\diamondp(0,0)}}%
\def\diamondp(#1){\ifnextchar|{\diamondpp(#1)}{\diamondpp(#1)|lrlr|}}%
\def\diamondpp(#1)|#2|{\ifnextchar/{\diamondppp(#1)|#2|}%
    {\diamondppp(#1)|#2|/>`>`>`>/}}%
\def\diamondppp(#1)|#2|/#3`#4`#5`#6/{%
    \ifnextchar<{\diamondpppp(#1)|#2|/#3`#4`#5`#6/}%
    {\diamondpppp(#1)|#2|/#3`#4`#5`#6/<400,400>}}%

\def\ptrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
\ignorespaces}%

\def\qtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xc|/{#6}/<0,-\deltay>[\nodeb`\nodec;\labelc]%
\ignorespaces}%

\def\dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
\advance\ypos by \deltay\advance \xpos by \deltax%
\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\ignorespaces}%

\def\btrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
\ignorespaces}%

\def\Atrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\multiply\deltax by 2%
\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,0>[\nodeb`\nodec;\labelc]%
\divide\deltax by 2%
\advance\ypos by \deltay\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
\ignorespaces}%

\def\Vtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
\multiply\deltax by 2%
\morphism(\xpos,\ypos)|\xa|/{#4}/<\deltax,0>[\nodea`\nodeb;\labela]%
\advance\xpos by \deltax \divide \deltax by 2%
\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
\ignorespaces}%

\def\Ctrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\advance \ypos by \deltay%
\morphism(\xpos,\ypos)|\xc|/{#6}/<\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
\advance\ypos by \deltay \advance \xpos by \deltax%
\morphism(\xpos,\ypos)|\xa|/{#4}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\multiply\deltay by 2%
\morphism(\xpos,\ypos)|\xb|/{#5}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\ignorespaces}%

\def\Dtrianglepppp(#1,#2)|#3|/#4`#5`#6/<#7>[#8]{%
\xpos#1\ypos#2%
\def\next|##1##2##3|{\def\xa{##1}\def\xb{##2}\def\xc{##3}}%
\next|#3|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#7>%
\def\next[##1`##2`##3;##4`##5`##6]{%
    \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
    \def\labela{##4}\def\labelb{##5}\def\labelc{##6}}%
\next[#8]%
\advance\xpos by \deltax \advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xc|/{#6}/<-\deltax,-\deltay>[\nodeb`\nodec;\labelc]%
\advance\xpos by -\deltax \advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xb|/{#5}/<\deltax,-\deltay>[\nodea`\nodeb;\labelb]%
\multiply \deltay by 2%
\morphism(\xpos,\ypos)|\xa|/{#4}/<0,-\deltay>[\nodea`\nodec;\labela]%
\ignorespaces}%

\def\ptriangle{\ifnextchar({\ptrianglep}{\ptrianglep(0,0)}}%
\def\ptrianglep(#1){\ifnextchar|{\ptrianglepp(#1)}{\ptrianglepp(#1)|alr|}}%
\def\ptrianglepp(#1)|#2|{\ifnextchar/{\ptriangleppp(#1)|#2|}%
    {\ptriangleppp(#1)|#2|/>`>`>/}}%
\def\ptriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\ptrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\ptrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\qtriangle{\ifnextchar({\qtrianglep}{\qtrianglep(0,0)}}%
\def\qtrianglep(#1){\ifnextchar|{\qtrianglepp(#1)}{\qtrianglepp(#1)|alr|}}%
\def\qtrianglepp(#1)|#2|{\ifnextchar/{\qtriangleppp(#1)|#2|}%
    {\qtriangleppp(#1)|#2|/>`>`>/}}%
\def\qtriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\qtrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\qtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\dtriangle{\ifnextchar({\dtrianglep}{\dtrianglep(0,0)}}%
\def\dtrianglep(#1){\ifnextchar|{\dtrianglepp(#1)}{\dtrianglepp(#1)|lrb|}}%
\def\dtrianglepp(#1)|#2|{\ifnextchar/{\dtriangleppp(#1)|#2|}%
    {\dtriangleppp(#1)|#2|/>`>`>/}}%
\def\dtriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\dtrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\btriangle{\ifnextchar({\btrianglep}{\btrianglep(0,0)}}%
\def\btrianglep(#1){\ifnextchar|{\btrianglepp(#1)}{\btrianglepp(#1)|lrb|}}%
\def\btrianglepp(#1)|#2|{\ifnextchar/{\btriangleppp(#1)|#2|}%
    {\btriangleppp(#1)|#2|/>`>`>/}}%
\def\btriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\btrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\btrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\Atriangle{\ifnextchar({\Atrianglep}{\Atrianglep(0,0)}}%
\def\Atrianglep(#1){\ifnextchar|{\Atrianglepp(#1)}{\Atrianglepp(#1)|lrb|}}%
\def\Atrianglepp(#1)|#2|{\ifnextchar/{\Atriangleppp(#1)|#2|}%
    {\Atriangleppp(#1)|#2|/>`>`>/}}%
\def\Atriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\Atrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\Atrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\Vtriangle{\ifnextchar({\Vtrianglep}{\Vtrianglep(0,0)}}%
\def\Vtrianglep(#1){\ifnextchar|{\Vtrianglepp(#1)}{\Vtrianglepp(#1)|alb|}}%
\def\Vtrianglepp(#1)|#2|{\ifnextchar/{\Vtriangleppp(#1)|#2|}%
    {\Vtriangleppp(#1)|#2|/>`>`>/}}%
\def\Vtriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\Vtrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\Vtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\Ctriangle{\ifnextchar({\Ctrianglep}{\Ctrianglep(0,0)}}%
\def\Ctrianglep(#1){\ifnextchar|{\Ctrianglepp(#1)}{\Ctrianglepp(#1)|arb|}}%
\def\Ctrianglepp(#1)|#2|{\ifnextchar/{\Ctriangleppp(#1)|#2|}%
    {\Ctriangleppp(#1)|#2|/>`>`>/}}%
\def\Ctriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\Ctrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\Ctrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%

\def\Dtriangle{\ifnextchar({\Dtrianglep}{\Dtrianglep(0,0)}}%
\def\Dtrianglep(#1){\ifnextchar|{\Dtrianglepp(#1)}{\Dtrianglepp(#1)|lab|}}%
\def\Dtrianglepp(#1)|#2|{\ifnextchar/{\Dtriangleppp(#1)|#2|}%
    {\Dtriangleppp(#1)|#2|/>`>`>/}}%
\def\Dtriangleppp(#1)|#2|/#3`#4`#5/{%
    \ifnextchar<{\Dtrianglepppp(#1)|#2|/#3`#4`#5/}%
    {\Dtrianglepppp(#1)|#2|/#3`#4`#5/<\default,\default>}}%


\def\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
\def\next(##1,##2){\xpos##1\ypos##2}%
\next(#1)%
\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
\next|#2|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
 \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
 \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
\next[#9]%
\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,0>[\nodeb`\nodec;\labeld]%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xe|/{#7}/<\deltax,0>[\nodec`\noded;\labele]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
\ignorespaces}%

\def\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
\def\next(##1,##2){\xpos##1\ypos##2}%
\next(#1)%
\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
\next|#2|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
 \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
 \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
\next[#9]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#3}/<\deltax,0>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,-\deltay>[\nodea`\noded;\labelc]%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,0>[\nodeb`\nodec;\labelb]%
\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
\ignorespaces}%

\def\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
\def\next(##1,##2){\xpos##1\ypos##2}%
\next(#1)%
\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
\next|#2|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
 \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
 \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
\next[#9]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xe|/{#7}/<0,-\deltay>[\nodec`\noded;\labele]%
\advance\xpos by -\deltax%
\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
\morphism(\xpos,\ypos)|\xd|/{#6}/<\deltax,-\deltay>[\nodeb`\noded;\labeld]%
\advance\ypos by \deltay%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xa|/{#3}/<-\deltax,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#4}/<0,-\deltay>[\nodea`\nodec;\labelb]%
\ignorespaces}%

\def\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<#8>[#9]{%
\def\next(##1,##2){\xpos##1\ypos##2}%
\next(#1)%
\def\next|##1##2##3##4##5|{\def\xa{##1}\def\xb{##2}%
\def\xc{##3}\def\xd{##4}\def\xe{##5}}%
\next|#2|%
\def\next<##1,##2>{\deltax=##1\deltay=##2\ignorespaces}%
\next<#8>%
\def\next[##1`##2`##3`##4;##5`##6`##7`##8`##9]{%
 \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}\def\noded{##4}%
 \def\labela{##5}\def\labelb{##6}\def\labelc{##7}\def\labeld{##8}\def\labele{##9}}%
\next[#9]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xc|/{#5}/<\deltax,0>[\nodeb`\nodec;\labelc]%
\morphism(\xpos,\ypos)|\xd|/{#6}/<0,-\deltay>[\nodeb`\noded;\labeld]%
\advance\ypos by \deltay%
\morphism(\xpos,\ypos)|\xa|/{#3}/<0,-\deltay>[\nodea`\nodeb;\labela]%
\morphism(\xpos,\ypos)|\xb|/{#4}/<\deltax,-\deltay>[\nodea`\nodec;\labelb]%
\advance\ypos by -\deltay%
\advance\xpos by \deltax%
\morphism(\xpos,\ypos)|\xe|/{#7}/<-\deltax,-\deltay>[\nodec`\noded;\labele]%
\ignorespaces}%
\def\Atrianglepair{\ifnextchar({\Atrianglepairp}{\Atrianglepairp(0,0)}}%
\def\Atrianglepairp(#1){\ifnextchar|{\Atrianglepairpp(#1)}%
{\Atrianglepairpp(#1)|lmrbb|}}%
\def\Atrianglepairpp(#1)|#2|{\ifnextchar/{\Atrianglepairppp(#1)|#2|}%
    {\Atrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
\def\Atrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
    \ifnextchar<{\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
    {\Atrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%

\def\Vtrianglepair{\ifnextchar({\Vtrianglepairp}{\Vtrianglepairp(0,0)}}%
\def\Vtrianglepairp(#1){\ifnextchar|{\Vtrianglepairpp(#1)}%
{\Vtrianglepairpp(#1)|aalmr|}}%
\def\Vtrianglepairpp(#1)|#2|{\ifnextchar/{\Vtrianglepairppp(#1)|#2|}%
    {\Vtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
\def\Vtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
    \ifnextchar<{\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
    {\Vtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%

\def\Ctrianglepair{\ifnextchar({\Ctrianglepairp}{\Ctrianglepairp(0,0)}}%
\def\Ctrianglepairp(#1){\ifnextchar|{\Ctrianglepairpp(#1)}%
{\Ctrianglepairpp(#1)|lrmlr|}}%
\def\Ctrianglepairpp(#1)|#2|{\ifnextchar/{\Ctrianglepairppp(#1)|#2|}%
    {\Ctrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
\def\Ctrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
    \ifnextchar<{\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
    {\Ctrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%

\def\Dtrianglepair{\ifnextchar({\Dtrianglepairp}{\Dtrianglepairp(0,0)}}%
\def\Dtrianglepairp(#1){\ifnextchar|{\Dtrianglepairpp(#1)}%
{\Dtrianglepairpp(#1)|lrmlr|}}%
\def\Dtrianglepairpp(#1)|#2|{\ifnextchar/{\Dtrianglepairppp(#1)|#2|}%
    {\Dtrianglepairppp(#1)|#2|/>`>`>`>`>/}}%
\def\Dtrianglepairppp(#1)|#2|/#3`#4`#5`#6`#7/{%
    \ifnextchar<{\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/}%
    {\Dtrianglepairpppp(#1)|#2|/#3`#4`#5`#6`#7/<\default,\default>}}%

\def\pplace[#1](#2,#3)[#4]{\POS(#2,#3)*+!!<0ex,\axis>!#1{#4}\ignorespaces}%
\def\cplace(#1,#2)[#3]{\POS(#1,#2)*+!!<0ex,\axis>{#3}\ignorespaces}%
\def\place{\ifnextchar[{\pplace}{\cplace}}%

\def\pullback#1]#2]{\square#1]\trident#2]\ignorespaces}%

\def\tridentppp|#1#2#3|/#4`#5`#6/<#7,#8>[#9]{%
\def\next[##1;##2`##3`##4]{\def\nodee{##1}\def\labele{##2}%
   \def\labelf{##3}\def\labelg{##4}}%
\next[#9]%
\advance \xpos by -\deltax%
\advance \xpos by -#7\advance \ypos by #8%
\advance\deltax by #7%
\morphism(\xpos,\ypos)|#1|/{#4}/<\deltax,-#8>[\nodee`\nodeb;\labele]%
\advance\deltax by -#7%
\morphism(\xpos,\ypos)|#2|/{#5}/<#7,-#8>[\nodee`\nodea;\labelf]%
\advance\deltay by #8%
\morphism(\xpos,\ypos)|#3|/{#6}/<#7,-\deltay>[\nodee`\nodec;\labelg]%
\ignorespaces}%

\def\trident{\ifnextchar|{\tridentp}{\tridentp|amb|}}%
\def\tridentp|#1|{\ifnextchar/{\tridentpp|#1|}{\tridentpp|#1|/{>}`{>}`{>}/}}%
\def\tridentpp|#1|/#2/{\ifnextchar<{\tridentppp|#1|/#2/}%
  {\tridentppp|#1|/#2/<500,500>}}%

\def\setmorphismwidth#1#2#3#4{%
 \setbox0=\hbox{$#1{\labelstyle#3#3}#2$}#4=\wd0%
 \divide #4 by 2 \divide #4 by \ul%
 \advance #4 by 350 \ratchet{#4}{500}}%

\def\setSquarewidth[#1`#2`#3`#4;#5`#6`#7`#8]{%
 \setmorphismwidth{#1}{#2}{#5}{\topw}%
 \setmorphismwidth{#3}{#4}{#8}{\botw}%
\ratchet{\topw}{\botw}}%

\def\Squarepppp(#1)|#2|/#3/<#4>[#5]{%
 \setSquarewidth[#5]%
 \squarepppp(#1)|#2|/#3/<\topw,#4>[#5]%
\ignorespaces}%

\def\Square{\ifnextchar({\Squarep}{\Squarep(0,0)}}%
\def\Squarep(#1){\ifnextchar|{\Squarepp(#1)}{\Squarepp(#1)|alrb|}}%
\def\Squarepp(#1)|#2|{\ifnextchar/{\Squareppp(#1)|#2|}%
    {\Squareppp(#1)|#2|/>`>`>`>/}}%
\def\Squareppp(#1)|#2|/#3`#4`#5`#6/{%
    \ifnextchar<{\Squarepppp(#1)|#2|/#3`#4`#5`#6/}%
    {\Squarepppp(#1)|#2|/#3`#4`#5`#6/<\default>}}%

\def\hsquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
\Xpos=#1\Ypos=#2%
\def\next|##1##2##3##4##5##6##7|{%
 \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
 \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
\next|#3|%
\def\next<##1,##2,##3>{\deltaX=##1\deltaXprime=##2\deltaY=##3}%
\next<#5>%
\def\next[##1`##2`##3`##4`##5`##6]{%
 \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
 \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
\next[#6]%
\def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
 \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
\next[#7]%
\dohsquares/#4/}%

\def\dohsquares/#1`#2`#3`#4`#5`#6`#7/{%
\squarepppp(\Xpos,\Ypos)|\Xa\Xc\Xd\Xf|/#1`#3`#4`#6/<\deltaX,\deltaY>%
 [\Nodea`\Nodeb`\Noded`\Nodee;\Labela`\Labelc`\Labeld`\Labelf]%
 \advance \Xpos by \deltaX%
\squarepppp(\Xpos,\Ypos)|\Xb\Xd\Xe\Xg|/#2``#5`#7/<\deltaXprime,\deltaY>%
[\Nodeb`\Nodec`\Nodee`\Nodef;\Labelb``\Labele`\Labelg]%
\ignorespaces}%

\def\hsquares{\ifnextchar({\hsquaresp}{\hsquaresp(0,0)}}%
\def\hsquaresp(#1){\ifnextchar|{\hsquarespp(#1)}{\hsquarespp%
(#1)|aalmrbb|}}%
\def\hsquarespp(#1)|#2|{\ifnextchar/{\hsquaresppp(#1)|#2|}%
    {\hsquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
\def\hsquaresppp(#1)|#2|/#3/{%
    \ifnextchar<{\hsquarespppp(#1)|#2|/#3/}%
    {\hsquarespppp(#1)|#2|/#3/<\default,\default,\default>}}%

\def\hSquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
\Xpos=#1\Ypos=#2%
\def\next|##1##2##3##4##5##6##7|{%
 \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
 \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
\next|#3|%
\deltaY=#5%
\def\next[##1`##2`##3`##4`##5`##6]{%
 \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
 \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
\next[#6]%
\def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
 \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
\next[#7]%
\dohSquares/#4/}%

\def\dohSquares/#1`#2`#3`#4`#5`#6`#7/{%
\Squarepppp(\Xpos,\Ypos)|\Xa\Xc\Xd\Xf|/#1`#3`#4`#6/<\deltaY>%
 [\Nodea`\Nodeb`\Noded`\Nodee;\Labela`\Labelc`\Labeld`\Labelf]%
 \advance \Xpos by \topw%
\Squarepppp(\Xpos,\Ypos)|\Xb\Xd\Xe\Xg|/#2``#5`#7/<\deltaY>%
[\Nodeb`\Nodec`\Nodee`\Nodef;\Labelb``\Labele`\Labelg]%
\ignorespaces}%

\def\hSquares{\ifnextchar({\hSquaresp}{\hSquaresp(0,0)}}%
\def\hSquaresp(#1){\ifnextchar|{\hSquarespp(#1)}{\hSquarespp%
(#1)|aalmrbb|}}%
\def\hSquarespp(#1)|#2|{\ifnextchar/{\hSquaresppp(#1)|#2|}%
    {\hSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
\def\hSquaresppp(#1)|#2|/#3/{%
    \ifnextchar<{\hSquarespppp(#1)|#2|/#3/}%
    {\hSquarespppp(#1)|#2|/#3/<\default>}}%

\def\vsquarespppp(#1,#2)|#3|/#4/<#5>[#6;#7]{%
\Xpos=#1\Ypos=#2%
\def\next|##1##2##3##4##5##6##7|{%
 \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
 \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
\next|#3|%
\def\next<##1,##2,##3>{\deltaX=##1\deltaY=##2\deltaYprime=##3}%
\next<#5>%
\def\next[##1`##2`##3`##4`##5`##6]{%
 \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
 \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
\next[#6]%
\def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
 \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
\next[#7]%
\dovsquares/#4/}%

\def\dovsquares/#1`#2`#3`#4`#5`#6`#7/{%
\squarepppp(\Xpos,\Ypos)|\Xd\Xe\Xf\Xg|/`#5`#6`#7/<\deltaX,\deltaYprime>%
[\Nodec`\Noded`\Nodee`\Nodef;`\Labele`\Labelf`\Labelg]%
 \advance\Ypos by \deltaYprime%
\squarepppp(\Xpos,\Ypos)|\Xa\Xb\Xc\Xd|/#1`#2`#3`#4/<\deltaX,\deltaY>%
 [\Nodea`\Nodeb`\Nodec`\Noded;\Labela`\Labelb`\Labelc`\Labeld]%
\ignorespaces}%

\def\vsquares{\ifnextchar({\vsquaresp}{\vsquaresp(0,0)}}%
\def\vsquaresp(#1){\ifnextchar|{\vsquarespp(#1)}{\vsquarespp%
(#1)|aalmrbb|}}%
\def\vsquarespp(#1)|#2|{\ifnextchar/{\vsquaresppp(#1)|#2|}%
    {\vsquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
\def\vsquaresppp(#1)|#2|/#3/{%
    \ifnextchar<{\vsquarespppp(#1)|#2|/#3/}%
    {\vsquarespppp(#1)|#2|/#3/<\default,\default,\default>}}%


\def\vSquarespppp(#1,#2)|#3|/#4/<#5,#6>[#7;#8]{%
\Xpos=#1\Ypos=#2%
\def\next|##1##2##3##4##5##6##7|{%
 \def\Xa{##1}\def\Xb{##2}\def\Xc{##3}\def\Xd{##4}%
 \def\Xe{##5}\def\Xf{##6}\def\Xg{##7}}%
\next|#3|%
\deltaX=#5%
\deltaY=#6%
\def\next[##1`##2`##3`##4`##5`##6]{%
 \def\Nodea{##1}\def\Nodeb{##2}\def\Nodec{##3}%
 \def\Noded{##4}\def\Nodee{##5}\def\Nodef{##6}}%
\next[#7]%
\def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\Labela{##1}\def\Labelb{##2}\def\Labelc{##3}\def\Labeld{##4}%
 \def\Labele{##5}\def\Labelf{##6}\def\Labelg{##7}}%
\next[#8]%
\dovSquares/#4/\ignorespaces}%

\def\dovSquares/#1`#2`#3`#4`#5`#6`#7/{%
\setmorphismwidth{\Nodea}{\Nodeb}{\Labela}{\topw}%
\setmorphismwidth{\Nodec}{\Noded}{\Labeld}{\botw}%
\ratchet{\topw}{\botw}%
\setmorphismwidth{\Nodee}{\Nodef}{\Labelg}{\botw}%
\ratchet{\topw}{\botw}%
\square(\Xpos,\Ypos)|\Xd\Xe\Xf\Xg|/`#5`#6`#7/<\topw,\deltaX>%
 [\Nodec`\Noded`\Nodee`\Nodef;`\Labele`\Labelf`\Labelg]%
\advance \Ypos by \deltaX%
\square(\Xpos,\Ypos)|\Xa\Xb\Xc\Xd|/#1`#2`#3`#4/<\topw,\deltaY>%
 [\Nodea`\Nodeb`\Nodec`\Noded;\Labela`\Labelb`\Labelc`\Labeld]%
}%

\def\vSquares{\ifnextchar({\vSquaresp}{\vSquaresp(0,0)}}%
\def\vSquaresp(#1){\ifnextchar|{\vSquarespp(#1)}{\vSquarespp%
(#1)|alrmlrb|}}%
\def\vSquarespp(#1)|#2|{\ifnextchar/{\vSquaresppp(#1)|#2|}%
    {\vSquaresppp(#1)|#2|/>`>`>`>`>`>`>/}}%
\def\vSquaresppp(#1)|#2|/#3/{%
    \ifnextchar<{\vSquarespppp(#1)|#2|/#3/}%
    {\vSquarespppp(#1)|#2|/#3/<\default,\default>}}%

\def\osquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{\squarepppp%
 (#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
 \let\Nodea\nodea\let\Nodeb\nodeb%
\let\Nodec\nodec\let\Noded\noded\Xpos=\xpos\Ypos=\ypos%
\deltaX=\deltax \deltaY=\deltay \isquare}%

\def\cube{\ifnextchar({\osquarep}{\osquarep(0,0)}}%
\def\osquarep(#1){\ifnextchar|{\osquarepp(#1)}{\osquarepp(#1)|alrb|}}%
\def\osquarepp(#1)|#2|{\ifnextchar/{\osquareppp(#1)|#2|}%
    {\osquareppp(#1)|#2|/>`>`>`>/}}%
\def\osquareppp(#1)|#2|/#3`#4`#5`#6/{%
    \ifnextchar<{\osquarepppp(#1)|#2|/#3`#4`#5`#6/}%
    {\osquarepppp(#1)|#2|/#3`#4`#5`#6/<1500,1500>}}%

\def\isquarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]{%
 \squarepppp(#1)|#2|/#3`#4`#5`#6/<#7>[#8]%
\ifnextchar|{\cubep}{\cubep|mmmm|}}%
\def\cubep|#1|{\ifnextchar/{\cubepp|#1|}{\cubepp|#1|/>`>`>`>/}}%

\def\isquare{\ifnextchar({\isquarep}{\isquarep(\default,\default)}}%
\def\isquarep(#1){\ifnextchar|{\isquarepp(#1)}{\isquarepp(#1)|alrb|}}%
\def\isquarepp(#1)|#2|{\ifnextchar/{\isquareppp(#1)|#2|}%
    {\isquareppp(#1)|#2|/>`>`>`>/}}%
\def\isquareppp(#1)|#2|/#3`#4`#5`#6/{%
    \ifnextchar<{\isquarepppp(#1)|#2|/#3`#4`#5`#6/}%
    {\isquarepppp(#1)|#2|/#3`#4`#5`#6/<500,500>}}%

\def\cubepp|#1#2#3#4|/#5`#6`#7`#8/[#9]{%
\def\next[##1`##2`##3`##4]{\gdef\Labela{##1}%
\gdef\Labelb{##2}\gdef\Labelc{##3}\gdef\Labeld{##4}}\next[#9]%
\xend\xpos \yend\ypos%
\Xend\xend\advance\Xend by -\Xpos%
\Yend\yend\advance\Yend by -\Ypos%
\domorphism(\Xpos,\Ypos)|#2|/#6/<\Xend,\Yend>[\Nodeb`\nodeb;\Labelb]%
\advance\Xpos by-\deltaX%
\advance\xend by-\deltax%
\Xend\xend\advance\Xend by -\Xpos%
\domorphism(\Xpos,\Ypos)|#1|/#5/<\Xend,\Yend>[\Nodea`\nodea;\Labela]%
\advance\Ypos by-\deltaY%
\advance\yend by-\deltay%
\Yend\yend\advance\Yend by -\Ypos%
\domorphism(\Xpos,\Ypos)|#3|/#7/<\Xend,\Yend>[\Nodec`\nodec;\Labelc]%
\advance\Xpos by\deltaX%
\advance\xend by\deltax%
\Xend\xend\advance\Xend by -\Xpos%
\domorphism(\Xpos,\Ypos)|#4|/#8/<\Xend,\Yend>[\Noded`\noded;\Labeld]%
\ignorespaces}%

\def\setwdth#1#2{\setbox0\hbox{$\labelstyle#1$}\wdth=\wd0%
\setbox0\hbox{$\labelstyle#2$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi}%

\def\topppp/#1/<#2>^#3_#4{\:%
\ifnum#2=0%
   \setwdth{#3}{#4}\deltax=\wdth \divide \deltax by \ul%
   \advance \deltax by \defaultmargin  \ratchet{\deltax}{100}%
\else \deltax #2%
\fi%
\xy\ar@{#1}^{#3}_{#4}(\deltax,0) \endxy%
\:}%

\def\toppp/#1/<#2>^#3{\ifnextchar_{\topppp/#1/<#2>^{#3}}{\topppp/#1/<#2>^{#3}_{}}}%
\def\topp/#1/<#2>{\ifnextchar^{\toppp/#1/<#2>}{\toppp/#1/<#2>^{}}}%
\def\toop/#1/{\ifnextchar<{\topp/#1/}{\topp/#1/<0>}}%
\def\to{\ifnextchar/{\toop}{\toop/>/}}%


\def\mon{\to/ >->/}%
\def\epi{\to/->>/}%
\def\toleft{\to/<-/}%
\def\monleft{\to/<-< /}%
\def\epileft{\to/<<-/}%

\def\rlimto{{%
\font\xyatipfont=xyatip10 scaled 800
\font\xybtipfont=xybtip10 scaled 800
\raise 2pt\hbox{\,\xy\ar@{->}(100,0) \endxy}\,}}
\def\llimto{{%
\font\xyatipfont=xyatip10 scaled 800
\font\xybtipfont=xybtip10 scaled 800
\raise 2pt\hbox{\,\xy\ar@{<-}(100,0) \endxy}\,}}


\def\twopppp/#1`#2/<#3>^#4_#5{\:%
\ifnum0=#3%
  \setwdth{#4}{#5}\deltax=\wdth \divide \deltax by \ul \advance \deltax%
  by \defaultmargin \ratchet{\deltax}{200}%
\else \deltax#3 \fi%
\xy\ar@{#1}@<2.5pt>^{#4}(\deltax,0)%
\ar@{#2}@<-2.5pt>_{#5}(\deltax,0)\endxy\:}%

\def\twoppp/#1`#2/<#3>^#4{\ifnextchar_{\twopppp/#1`#2/<#3>^{#4}}%
  {\twopppp/#1`#2/<#3>^{#4}_{}}}%
\def\twopp/#1`#2/<#3>{\ifnextchar^{\twoppp/#1`#2/<#3>}{\twoppp/#1`#2/<#3>^{}}}%
\def\twop/#1`#2/{\ifnextchar<{\twopp/#1`#2/}{\twopp/#1`#2/<0>}}%
\def\two{\ifnextchar/{\twop}{\twop/>`>/}}%

\def\twoleft{\two/<-`<-/}%

\def\threeppppp/#1`#2`#3/<#4>^#5|#6_#7{\:%
\ifnum0=#4%
\setbox0\hbox{$\labelstyle#5$}\wdth=\wd0%
\setbox0\hbox{$\labelstyle#6$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi%
\setbox0\hbox{$\labelstyle#7$}\ifnum\wdth<\wd0 \wdth=\wd0 \fi%
\deltax=\wdth \divide \deltax by \ul \advance \deltax by%
\defaultmargin \ratchet{\deltax}{300}%
\else\deltax#4 \fi%
    \xy \ifnum\wd0=0 \ar@{#2}(\deltax,0)%
    \else \ar@{#2}|{#6}(\deltax,0)\fi%
\ar@{#1}@<4.5pt>^{#5}(\deltax,0)%
\ar@{#3}@<-4.5pt>_{#7}(\deltax,0)\endxy\:}%

\def\threepppp/#1`#2`#3/<#4>^#5|#6{\ifnextchar_{\threeppppp%
  /#1`#2`#3/<#4>^{#5}|{#6}}{\threeppppp/#1`#2`#3/<#4>^{#5}|{#6}_{}}}%
\def\threeppp/#1`#2`#3/<#4>^#5{\ifnextchar|{\threepppp%
  /#1`#2`#3/<#4>^{#5}}{\threepppp/#1`#2`#3/<#4>^{#5}|{}}}%
\def\threepp/#1`#2`#3/<#4>{\ifnextchar^{\threeppp/#1`#2`#3/<#4>}%
  {\threeppp/#1`#2`#3/<#4>^{}}}%
\def\threep/#1`#2`#3/{\ifnextchar<{\threepp/#1`#2`#3/}%
  {\threepp/#1`#2`#3/<0>}}%
\def\three{\ifnextchar/{\threep}{\threep/>`>`>/}}%


\def\twoar(#1,#2){{%
 \scalefactor{0.1}%
 \deltax#1\deltay#2%
 \deltaX=\ifnum\deltax<0-\fi\deltax%
 \deltaY=\ifnum\deltay<0-\fi\deltay%
 \Xend\deltax \multiply \Xend by \deltax%
 \Yend\deltay \multiply \Yend by \deltay%
 \advance\Xend by \Yend \multiply \Xend by 3%
 \ifnum \deltaX > \deltaY%
    \multiply \deltaX by 3 \advance \deltaX by \deltaY%
 \else%
    \multiply \deltaY by 3 \advance \deltaX by \deltaY%
 \fi%
 \multiply\deltax by 500%
 \multiply\deltay by 500%
 \xpos\deltax \multiply \xpos by 3 \divide\xpos by \deltaX%
 \Xpos\deltax \multiply \Xpos by \deltaX \divide \Xpos by \Xend%
 \advance \xpos by \Xpos%
 \ypos\deltay \multiply \ypos by 3 \divide\ypos by \deltaX%
 \Ypos\deltay \multiply \Ypos by \deltaX \divide \Ypos by \Xend%
 \advance \ypos by \Ypos%
 \xy \ar@{=>}(\xpos,\ypos) \endxy%
}\ignorespaces}%

\def\iiixiiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
 \xpos#1\ypos#2\relax%
 \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
 \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\nextt|##7|}%
 \def\nextt|##1##2##3##4##5##6|{\def\xg{##1}\def\xh{##2}%
 \def\xi{##3}\def\xj{##4}\def\xk{##5}\def\xl{##6}}%
 \next|#3|%
 \def\next<##1,##2>{\deltax##1\deltay##2}%
 \next<#5>%
 \def\next<##1,##2>{\deltaX##1\deltaY##2}%
 \next<#7>%
 \def\next##1{\topw##1\relax%
 \ifodd\topw \def\za{}\else\def\za{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\ze{}\else\def\ze{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zf{}\else\def\zf{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zg{}\else\def\zg{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zh{}\else\def\zh{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zi{}\else\def\zi{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zj{}\else\def\zj{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zk{}\else\def\zk{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zl{}\else\def\zl{\relax}\fi}%
  % \ifodd\topw \def\zl{}\else\def\zl{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zk{}\else\def\zk{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zj{}\else\def\zj{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zi{}\else\def\zi{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zh{}\else\def\zh{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zg{}\else\def\zg{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zf{}\else\def\zf{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\ze{}\else\def\ze{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
  % \ifodd\topw \def\za{}\else\def\za{\relax}\fi}%
 \next{#6}%
 \def\next[##1`##2`##3`##4`##5`##6`##7`##8`##9]{%
 \def\nodeA{##1}\def\nodeB{##2}\def\nodeC{##3}%
 \def\nodeD{##4}\def\nodeE{##5}\def\nodeF{##6}%
 \def\nodeG{##7}\def\nodeH{##8}\def\nodeI{##9}}%
 \next[#8]%
 \def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
 \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\nextt[##7]}%
 \def\nextt[##1`##2`##3`##4`##5`##6]{%
 \def\labelg{##1}\def\labelh{##2}\def\labeli{##3}%
 \def\labelj{##4}\def\labelk{##5}\def\labell{##6}}%
 \next[#9]%
 \def\next/##1`##2`##3`##4`##5`##6`##7`##8/{%
 \advance\ypos\deltay
    \ifx\zf\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeD`0;]\fi
 \morphism(\xpos,\ypos)|\xf|/{##6}/<\deltax,0>[\nodeD`\nodeE;\labelf]%
    \advance \xpos\deltax
    \morphism(\xpos,\ypos)|\xg|/{##7}/<\deltax,0>[\nodeE`\nodeF;\labelg]%
    \ifx\zg\empty \advance\xpos \deltax
        \morphism(\xpos,\ypos)<\deltaX,0>[\nodeF`0;]\fi
    \xpos#1 \advance\ypos\deltay
    \ifx\zd\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeA`0;]\fi
    \ifx\za\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeA`0;]\fi
    \morphism(\xpos,\ypos)|\xa|/{##1}/<\deltax,0>[\nodeA`\nodeB;\labela]%
 \morphism(\xpos,\ypos)|\xc|/{##3}/<0,-\deltay>[\nodeA`\nodeD;\labelc]%
    \advance \xpos\deltax
     \morphism(\xpos,\ypos)|\xb|/{##2}/<\deltax,0>[\nodeB`\nodeC;\labelb]%
     \morphism(\xpos,\ypos)|\xd|/{##4}/<0,-\deltay>[\nodeB`\nodeE;\labeld]%
     \ifx\zb\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeB`0;]\fi
     \advance\xpos\deltax
 \morphism(\xpos,\ypos)|\xe|/{##5}/<0,-\deltay>[\nodeC`\nodeF;\labele]%
     \ifx\zc\empty \morphism(\xpos,\ypos)/<-/<0,\deltaY>[\nodeC`0;]\fi
     \ifx\ze\empty \morphism(\xpos,\ypos)<\deltaX,0>[\nodeC`0;]\fi
   \nextt/##8/}%
 \def\nextt/##1`##2`##3`##4`##5/{%
 \xpos#1\ypos#2\relax%
   \ifx\zh\empty \morphism(\xpos,\ypos)/<-/<-\deltaX,0>[\nodeG`0;]\fi
   \ifx\zj\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeG`0;]\fi
   \morphism(\xpos,\ypos)|\xk|/{##4}/<\deltax,0>[\nodeG`\nodeH;\labelk]%
   \advance\xpos\deltax
   \morphism(\xpos,\ypos)|\xl|/{##5}/<\deltax,0>[\nodeH`\nodeI;\labell]%
   \ifx\zk\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeH`0;]\fi
   \advance\xpos\deltax
   \ifx\zi\empty \morphism(\xpos,\ypos)<\deltaX,0>[\nodeI`0;]\fi
   \ifx\zl\empty \morphism(\xpos,\ypos)<0,-\deltaY>[\nodeI`0;]\fi
   \xpos#1 \advance\ypos\deltay
    \morphism(\xpos,\ypos)|\xh|/{##1}/<0,-\deltay>[\nodeD`\nodeG;\labelh]%
    \advance \xpos\deltax
    \morphism(\xpos,\ypos)|\xi|/{##2}/<0,-\deltay>[\nodeE`\nodeH;\labeli]%
    \advance \xpos\deltax
 \morphism(\xpos,\ypos)|\xj|/{##3}/<0,-\deltay>[\nodeF`\nodeI;\labelj]}%
 \next/#4/\ignorespaces}%

\def\iiixiii{\ifnextchar({\iiixiiip}{\iiixiiip(0,0)}}%
\def\iiixiiip(#1){\ifnextchar|{\iiixiiipp(#1)}%
  {\iiixiiipp(#1)|aalmrmmlmrbb|}}%
\def\iiixiiipp(#1)|#2|{\ifnextchar/{\iiixiiippp(#1)|#2|}%
    {\iiixiiippp(#1)|#2|/>`>`>`>`>`>`>`>`>`>`>`>/}}%
\def\iiixiiippp(#1)|#2|/#3/{%
    \ifnextchar<{\iiixiiipppp(#1)|#2|/#3/}%
    {\iiixiiipppp(#1)|#2|/#3/<\default,\default>}}%
\def\iiixiiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiiippppp(#1)|#2|/#3/%
   <#4>0<0,0>}{\iiixiiippppp(#1)|#2|/#3/<#4>}}%
\def\iiixiiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
   {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}}%
   {\iiixiiipppppp(#1)|#2|/#3/<#4>{#5}<400,400>}}%


\def\iiixiipppppp(#1,#2)|#3|/#4/<#5>#6<#7>[#8;#9]{%
 \xpos#1\ypos#2\relax%
 \def\next|##1##2##3##4##5##6##7|{\def\xa{##1}\def\xb{##2}%
 \def\xc{##3}\def\xd{##4}\def\xe{##5}\def\xf{##6}\def\xg{##7}}%
 \next|#3|%
 \def\next<##1,##2>{\deltax##1\deltay##2}%
 \next<#5>%
 \deltaX#7
 \topw#6
 \def\next{%
 \ifodd\topw \def\za{}\else\def\za{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zb{}\else\def\zb{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zc{}\else\def\zc{\relax}\fi \divide\topw by 2
 \ifodd\topw \def\zd{}\else\def\zd{\relax}\fi}%
 \next%
 \def\next[##1`##2`##3`##4`##5`##6]{%
 \def\nodea{##1}\def\nodeb{##2}\def\nodec{##3}%
 \def\noded{##4}\def\nodee{##5}\def\nodef{##6}}%
 \next[#8]%
 \def\next[##1`##2`##3`##4`##5`##6`##7]{%
 \def\labela{##1}\def\labelb{##2}\def\labelc{##3}%
 \def\labeld{##4}\def\labele{##5}\def\labelf{##6}\def\labelg{##7}}%
 \next[#9]%
 \def\next/##1`##2`##3`##4`##5`##6`##7/{%
 {\ifx\zc\empty\advance\xpos -\deltaX
\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\noded;]\fi}%
 \morphism(\xpos,\ypos)|\xf|/##6/<\deltax,0>[\noded`\nodee;\labelf]%
 \advance\xpos by \deltax%
 \morphism(\xpos,\ypos)|\xg|/##7/<\deltax,0>[\nodee`\nodef;\labelg]%
 {\ifx\zd\empty \advance\xpos by \deltax
\relax  \morphism(\xpos,\ypos)<\deltaX,0>[\nodef`0;]\fi}%
 \advance\xpos by -\deltax  \advance\ypos by \deltay
 {\ifx\za\empty\advance \xpos by -\deltaX
\relax\morphism(\xpos,\ypos)<\deltaX,0>[0`\nodea;]\fi}%
 \morphism(\xpos,\ypos)|\xa|/##1/<\deltax,0>[\nodea`\nodeb;\labela]%
 \morphism(\xpos,\ypos)|\xc|/##3/<0,-\deltay>[\nodea`\noded;\labelc]%
 \advance\xpos by \deltax%
 \morphism(\xpos,\ypos)|\xb|/##2/<\deltax,0>[\nodeb`\nodec;\labelb]%
 \morphism(\xpos,\ypos)|\xd|/##4/<0,-\deltay>[\nodeb`\nodee;\labeld]%
 \advance\xpos by \deltax%
 \morphism(\xpos,\ypos)|\xe|/##5/<0,-\deltay>[\nodec`\nodef;\labele]%
 \ifx\zb\empty\relax \morphism(\xpos,\ypos)<\deltaX,0>[\nodec`0;]\fi}%
 \next/#4/\ignorespaces}%

\def\iiixii{\ifnextchar({\iiixiip}{\iiixiip(0,0)}}%
\def\iiixiip(#1){\ifnextchar|{\iiixiipp(#1)}%
  {\iiixiipp(#1)|aalmrbb|}}%
\def\iiixiipp(#1)|#2|{\ifnextchar/{\iiixiippp(#1)|#2|}%
    {\iiixiippp(#1)|#2|/>`>`>`>`>`>`>/}}%
\def\iiixiippp(#1)|#2|/#3/{%
    \ifnextchar<{\iiixiipppp(#1)|#2|/#3/}%
    {\iiixiipppp(#1)|#2|/#3/<\default,\default>}}%
\def\iiixiipppp(#1)|#2|/#3/<#4>{\ifnextchar[{\iiixiippppp(#1)|#2|/#3/%
   <#4>{0}<0>}{\iiixiippppp(#1)|#2|/#3/<#4>}}%
\def\iiixiippppp(#1)|#2|/#3/<#4>#5{\ifnextchar<%
   {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}}%
   {\iiixiipppppp(#1)|#2|/#3/<#4>{#5}<400>}}%

\def\node#1(#2,#3)[#4]{%
\expandafter\gdef\csname x@#1\endcsname{#2}%
\expandafter\gdef\csname y@#1\endcsname{#3}%
\expandafter\gdef\csname ob@#1\endcsname{#4}%
\ignorespaces}%

\newcount\xfinish%
\newcount\yfinish%
\def\arrow{\ifnextchar|{\arrowp}{\arrowp|a|}}%
\def\arrowp|#1|{\ifnextchar/{\arrowpp|#1|}{\arrowpp|#1|/>/}}%
\def\arrowpp|#1|/#2/[#3`#4;#5]{%
\xfinish=\csname x@#4\endcsname%
\yfinish=\csname y@#4\endcsname%
\advance\xfinish by -\csname x@#3\endcsname%
\advance\yfinish by -\csname y@#3\endcsname%
\morphism(\csname x@#3\endcsname,\csname y@#3\endcsname)|#1|/{#2}/%
<\xfinish,\yfinish>[\csname ob@#3\endcsname`\csname ob@#4\endcsname;#5]%
}%


\def\Loop(#1,#2)#3(#4,#5){\POS(#1,#2)*+!!<0ex,\axis>{#3}\ar@(#4,#5)}%
\def\iloop#1(#2,#3){\xy\Loop(0,0)#1(#2,#3)\endxy}%

\catcode`\@=\atcode%
\endinput%
\entrymodifiers={+!!<0pt,\fontdimen22\textfont2>}%



   the \xybox  does not allow control over *where*,%
inside the <object> that it builds,%
the reference point is to be located.%

Accordingly, I've just devised a variant that builds%
the same kind of compound <object>, but also sets%
its reference-point to be at the <coord> of the%
last <POS> within the box; i.e., the <coord> for%
the <object> that has been built is at the current%
<POS> when the Xy-pic parsing has been completed.%
The LRUD extents are the size of the complete box;%
i.e., *not* the extents of the final <POS>.%

Here is coding that should go in your document's%
preamble -- eventually it should be added to  xy.tex%



---------  start of new Xy-pic definitions  -------%


> \makeatletter   % adjust the \catcode of @%

 this is a better definition for the new  \xyobjbox%

   \xydef@\xyobjbox#1{\xy%
     \let \PATHafterPOS\PATHafterPOS@default%
     \let \arsavedPATHafterPOS@@\relax%
     \let\afterar@@\relax%
     \POS#1\endxyobj\Edge@c={\rectangleEdge}\computeLeftUpness@}%

> \xydef@\endxyobj{\if\inxy@\else\xyerror@{Unexpected \string\endxy}{}\fi%
>  \relax%
>   \dimen@=\Y@max \advance\dimen@-\Y@min%
>   \ifdim\dimen@<\z@ \dimen@=\z@ \Y@min=\z@ \Y@max=\z@ \fi%
>   \dimen@=\X@max \advance\dimen@-\X@min%
>   \ifdim\dimen@<\z@ \dimen@=\z@ \X@min=\z@ \X@max=\z@ \fi%
>   \edef\tmp@{\egroup%
>     \setboxz@h{\kern-\the\X@min \boxz@}%
>     \ht\z@=\the\Y@max \dp\z@=-\the\Y@min \wdz@=\the\dimen@%
>     \noexpand\maybeunraise@ \raise\dimen@\boxz@%
>     \noexpand\recoverXyStyle@ \egroup \noexpand\xy@end%
>     \U@c=\the\Y@max \advance\U@c-\the\Y@c%
>     \D@c=-\the\Y@min \advance\D@c\the\Y@c%
>     \L@c=-\the\X@min  \advance\L@c\the\X@c%
>     \R@c=\the\X@max  \advance\R@c-\the\X@c%
>    }\tmp@}%
>%
> \makeatother   % revert \catcode of @%
>%
> ---------  end of new Xy-pic definitions  -------%
\makeatletter%
\gdef\xymerge@MinMax{}%
\xydef@\twocell{\hbox\bgroup\xysave@MinMax\@twocell}%
\xydef@\uppertwocell{\hbox\bgroup\xysave@MinMax\@uppertwocell}%
\xydef@\lowertwocell{\hbox\bgroup\xysave@MinMax\@lowertwocell}%
\xydef@\compositemap{\hbox\bgroup\xysave@MinMax\@compositemap}%
\xydef@\twocelll#1#{\hbox\bgroup\xysave@MinMax\xy@\save\save@\@twocelll{%
#1}}%

\xydef@\xysave@MinMax{\xdef\xymerge@MinMax{%
   \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi%
   \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi%
   \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi%
   \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi%
  }}%
\xydef@\drop@Twocell{\boxz@ \xymerge@MinMax}%


\xydef@\twocell@DONE{%
  \edef\tmp@{\egroup%
   \X@min=\the\X@min \X@max=\the\X@max%
   \Y@min=\the\Y@min \Y@max=\the\Y@max}\tmp@%
  \L@c=\X@c \advance\L@c-\X@min \R@c=\X@max \advance\R@c-\X@c%
  \D@c=\Y@c \advance\D@c-\Y@min \U@c=\Y@max \advance\U@c-\Y@c%
  \ht\z@=\U@c \dp\z@=\D@c \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@%
  \computeLeftUpness@%
  \setboxz@h{\kern-\X@p \raise-\Y@c\boxz@ }%
  \dimen@=\L@c \advance\dimen@\R@c \wdz@=\dimen@ \ht\z@=\U@c \dp\z@=\D@c%
  \Edge@c={\rectangleEdge}\Invisible@false \Hidden@false%
  \edef\Drop@@{\noexpand\drop@Twocell%
   \noexpand\def\noexpand\Leftness@{\Leftness@}%
   \noexpand\def\noexpand\Upness@{\Upness@}}%
  \edef\Connect@@{\noexpand\connect@Twocell%
   \noexpand\ifdim\X@max<\the\X@max \X@max=\the\X@max\noexpand\fi%
   \noexpand\ifdim\X@min>\the\X@min \X@min=\the\X@min\noexpand\fi%
   \noexpand\ifdim\Y@max<\the\Y@max \Y@max=\the\Y@max\noexpand\fi%
   \noexpand\ifdim\Y@min>\the\Y@min \Y@min=\the\Y@min\noexpand\fi }%
  \xymerge@MinMax%
}%
\makeatother%


